#include <stdio.h>              // 标准输入输出
#include <stdlib.h>             // 标准函数库
#include <string.h>             // 字符串处理(操作字符数组)

#include "ohos_init.h"          // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h"          // CMSIS-RTOS API V2

#include "gas_sensor.h"
#include "jw01.h"
#include "oxygen.h"
#include "fire.h"
#include "sound.h"
#include "suv.h"


#include "wifi_connecter.h"     // easy wifi (station模式)
#include "mqtt_task.h"          // MQTT接口


// 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
#define PARAM_HOTSPOT_SSID "jit-OpenAtom"    // AP名称
#define PARAM_HOTSPOT_PSK "jitopenatom"      // AP密码
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中


// // 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
// #define PARAM_HOTSPOT_SSID "jit-OpenAtom"           // AP名称
// #define PARAM_HOTSPOT_PSK "jitopenatom"      // AP密码
// #define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中

// 根据之前的“MQTT连接华为云”课程，定义连接需要的参数：

// // 平台接入地址
// #define PARAM_SERVER_ADDR "192.168.31.214"

// // 端口号，MQTT协议对应的是1883
// #define PARAM_SERVER_PORT "1883"

// // 客户端ID
// #define PARAM_CLIENT_ID "Pegasus0001"

// // 用户名
// #define PARAM_USER_NAME "Pegasus0001"

// // 密码
// #define PARAM_PASSWORD "Pegasus0001"

// 平台接入地址
#define PARAM_SERVER_ADDR "192.168.31.210"

// 端口号，MQTT协议对应的是1883
#define PARAM_SERVER_PORT "1883"

// 客户端ID
#define PARAM_CLIENT_ID "capsule_device"

// 用户名
#define PARAM_USER_NAME "anran"

// 密码
#define PARAM_PASSWORD "123456789"

// 主线程函数
static void capsule(void *arg)
{
    (void)arg;

    // 连接AP
    WifiDeviceConfig config = {0};                      // 定义热点配置
    strcpy(config.ssid, PARAM_HOTSPOT_SSID);            // 设置热点配置中的SSID
    strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);     // 设置热点配置中的密码
    config.securityType = PARAM_HOTSPOT_TYPE;           // 设置热点配置中的加密方式
    osDelay(10);
    int netId = ConnectToHotspot(&config);              // 连接到热点
    if (netId < 0)                                      // 检查是否成功连接到热点
    {
        printf("Connect to AP failed!\r\n");
        return;
    }

    // 初始化并启动MQTT任务，连接MQTT服务器
    MqttTaskInit();                                                     // 初始化并启动MQTT任务
    const char *host = PARAM_SERVER_ADDR;                               // MQTT服务器IP地址
    unsigned short port = atoi(PARAM_SERVER_PORT);                      // MQTT服务器端口
    const char *clientId = PARAM_CLIENT_ID;                             // MQTT客户端ID
    const char *username = PARAM_USER_NAME;                             // MQTT服务器用户名
    const char *password = PARAM_PASSWORD;                              // MQTT服务器密码
    if (MqttTaskConnect(host, port, clientId, username, password) != 0) // 连接MQTT服务器
    {
        printf("Connect to MQTT server failed!\r\n");
        return;
    }

    // 订阅主题
    char *stopic = "Capsule/report";                                           // 主题

    int rc = MqttTaskSubscribe(stopic);                                                 // 订阅主题
    if (rc != 0)                                                                        // 检查是否成功订阅主题
    {
        printf("MQTT Subscribe failed!\r\n");
        return;
    }
    printf("MQTT Subscribe OK\r\n");


    char *ptopic_fire = "capsule/report/fire";//主题
    char *ptopic_gas = "capsule/report/gas";//主题
    char *ptopic_co2 = "capsule/report/co2";//主题
    char *ptopic_oxygen = "capsule/report/oxygen";//主题
    char *ptopic_sound = "capsule/report/sound";//主题
    char *ptopic_suv = "capsule/report/suv";//主题


    // 工作循环
    while (1)
    {


        // //MQ-2
        char payload_gas[64] = {0};                                         // 消息内容
        snprintf(payload_gas, sizeof(payload_gas),
                 "{\"device_id\":\"capsule\", \"gas\":\"%.2f\"}",
                 GetGasLevel());                                        // 获取可燃气体传感器数据
        rc = MqttTaskPublish(ptopic_gas, payload_gas);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            {
                printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
                ConnectToHotspot(&config);
                MqttTaskConnect(host, port, clientId, username, password);
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
            }
        osDelay(10);


        //co2
        char payload_co2[64] = {0};                                         // 消息内容
        float co2=0.0;
        ReadJW01(&co2);
        snprintf(payload_co2, sizeof(payload_co2),
                 "{\"device_id\":\"capsule\", \"co2\":\"%.2f\"}",
                 co2);                                                      // 获取传感器数据
        rc = MqttTaskPublish(ptopic_co2, payload_co2);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            {
                printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
                ConnectToHotspot(&config);
                MqttTaskConnect(host, port, clientId, username, password);
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
            }
        osDelay(10);


        //fire
        char payload_fire[64] = {0};                                         // 消息内容

        snprintf(payload_fire, sizeof(payload_fire),
                 "{\"device_id\":\"capsule\", \"fire\":\"%d\"}",
                 GetFireLevel());                                        // 获取传感器数据
        rc = MqttTaskPublish(ptopic_fire, payload_fire);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            {
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
            }
        osDelay(10);


        //O2
        char payload_oxygen[64] = {0};                                         // 消息内容
        snprintf(payload_oxygen, sizeof(payload_oxygen),
                 "{\"device_id\":\"capsule\", \"oxygen\":\"%.2f\"}",
                 GetOxygenLevel());                                        
        rc = MqttTaskPublish(ptopic_oxygen, payload_oxygen);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            {
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
            }
        osDelay(10);



        //sound
        char payload_sound[64] = {0};                                         // 消息内容
        snprintf(payload_sound, sizeof(payload_sound),
                 "{\"device_id\":\"capsule\", \"sound\":\"%d\"}",
                 GetSoundLevel());                                       
        rc = MqttTaskPublish(ptopic_sound, payload_sound);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            {
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                              // 输出发布成功信息
            }
        osDelay(10);


        //suv
        char payload_suv[64] = {0};                                         // 消息内容
        snprintf(payload_suv, sizeof(payload_suv),
                 "{\"device_id\":\"capsule\", \"suv\":\"%.2f\"}",
                 suvLevel());                                       
        rc = MqttTaskPublish(ptopic_suv, payload_suv);                  
        if (rc != 0)                                                    
            {
            }
        else
            {
                //printf("MQTT Publish OK\r\n");                       
        osDelay(10);

        
        osDelay(100);        
    }
}

// 入口函数
static void Entry(void)
{


    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;

    // 创建线程
    if (osThreadNew(capsule, NULL, &attr) == NULL)
    {
        printf("[Entry] Falied to create mqttDemoTask!\n");
    }
}


// 运行入口函数
SYS_RUN(Entry);